package top.roadvast.network.client;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/**
 * @Author 郭泽鹏
 * @Date 2021/12/31 17:25
 * @Version 1.0
 * @Description
 *      文件上传案例的客户端：读取本地文件，上传到服务器，读取服务器回写的数据
 *
 *      明确：
 *          数据源：D:\IDEA\java-study\java-basic\network-programming\input\1.jpg
 *          目的地：服务器
 *
 *      实现步骤：
 *          1.创建一个本地字节流输入流FileInputStream对象，构造方法中绑定要读取的数据源
 *          2.创建一个客户端Socket对象，构造方法绑定服务器的IP地址和端口号
 *          3.使用Socket中的getOutputStream获取网络字节输出流OutputStream
 *          4.使用本地字节输入流FileInputStream对象中的read方法，读取本地文件
 *          5.使用网络字节输出流OutputStream中的write方法，把读取到的文件上传到服务器
 *          6.使用Socket中的getInputStream获取网络字节输入流InputStream
 *          7.使用网络字节输入流InputStream中的read方法读取服务器回写的数据
 *          8.释放资源（Socket、FileInputStream）
 */
public class TCPFileClient {
    public static void main(String[] args) {
        System.setProperty("user.dir", System.getProperty("user.dir") + "/java-basic/network-programming/");
        Socket socket = null;
        OutputStream outputStream = null;
        FileInputStream fileInputStream = null;
        InputStream inputStream = null;
        try {
            socket = new Socket("127.0.0.1", 8084);
            outputStream = socket.getOutputStream();
            System.out.println("已连接到服务器.");
            final File file = new File(System.getProperty("user.dir") + "/input/1.jpg");
            fileInputStream = new FileInputStream(file);
            final byte[] bytes = new byte[1024];    //缓冲区
            int len1 = -1;
            while ((len1 = fileInputStream.read(bytes)) != -1) {
                outputStream.write(bytes, 0 ,len1);
            }
            socket.shutdownOutput();
            //接收响应
            inputStream = socket.getInputStream();
            byte[] response = new byte[1024];
            int len = inputStream.read(response);
            System.out.println("接收到响应：" + new String(response, 0, len));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileInputStream != null) {
                    fileInputStream.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                } if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
